package com.sjc.springbootdemo.web;

import com.sjc.springbootdemo.domain.User;
import com.sjc.springbootdemo.exception.AppException;
import com.sjc.springbootdemo.exception.GlobalErrorHandler;
import com.sjc.springbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Classname UserController
 * @Description  * 用户管理模块的控制器组件
 *
 * RESTful风格的接口其实是一种风格和思想
 * 它认为系统里的各种东西都是资源，暴露出去的接口，都是对资源的一种操作
 * 所以在请求URL里面，按照一种风格标志出来你要操作的是哪个资源
 * 然后通过HTTP method来定义你要对这个资源执行什么样的操作。
 * @Date 2020/4/23 15:06
 * @Created by SangJiacun
 */
@RestController
// 这里就是表明了是/api接口，版本是/v1，/user表明这是员工管理模块
@RequestMapping(value="/api/v1/user")
public class UserController {
    @Autowired
    private UserService userService;

    // GET请求代表着是查询数据
    @GetMapping(value="/")
    public List<User> listUsers() {
        return userService.listUsers();
    }

    //这里用了@GetMapping，就代表只能接受GET请求
    //{userId}代表的是查询某个用户ID
    @GetMapping(value="/{userId}")
    public User getUser(@PathVariable("userId") Long userId) throws AppException {
        User user = userService.getUserById(userId);
        if (user == null) {
            throw new AppException("无该用户", userId.toString());
        }
        return user;
    }

    // POST请求代表着是新增数据
    // @PostMapping，表明仅仅接受POST请求
    @PostMapping
    public String saveUser(@Validated({User.Save.class}) @RequestBody User user, BindingResult bindingResult) {
        if(bindingResult.hasErrors()) {
            List<ObjectError> errors = bindingResult.getAllErrors();
            FieldError error = (FieldError)errors.get(0);
            String message = error.getObjectName() + "," + error.getField() + "," + error.getDefaultMessage();
            return "{'status': 'error', 'message': '" + message +"'}";
        }
        Long userId = userService.saveUser(user);
        return "{'status': 'success', 'message': '新增用户ID为" + userId + "'}";
    }

    // PUT请求代表的是更新
    // 在方法入参中使用@PathVariable注解配置请求中参数和方法入参的映射关系
    @PutMapping
    public String updateUser(@Validated({User.Update.class}) @RequestBody User user, BindingResult bindingResult) {
        if(bindingResult.hasErrors()) {
            List<ObjectError> errors = bindingResult.getAllErrors();
            FieldError error = (FieldError)errors.get(0);
            String message = error.getObjectName() + "," + error.getField() + "," + error.getDefaultMessage();
            return "{'status': 'error', 'message': '" + message +"'}";
        }
        int result = userService.updateUser(user);
        return result>=0?"success":"failed";
    }

    // DELETE请求代表的是删除
    // 这里用了@DeleteMapping，表明仅仅接受DELETE请求
    @DeleteMapping(value="/{userId}")
    public String deleteUser(@PathVariable("userId") Long userId) {
        int result = userService.removeUser(userId);
        return result>=0?"success":"failed";
    }


}
